package api

import (
	"github.com/labstack/echo/v4"
	"longmen/server/config/global"
	"longmen/server/pkg/common/api_models"
	"longmen/server/pkg/common/helper/const"
	"longmen/server/pkg/common/helper/util"
)

// @Summary app上报下载量
// @Description 同個调备id,同下載渠道，計入一次
// @Accept  json
// @Produce  json
// @Tags Notice
// @Success 0 {object} api_models.DownloadTimesReq "result"
// @Router /statistics/downloadTimes [POST]
func (base *Controller) DownloadTimes(c echo.Context) error {

	req := &api_models.DownloadTimesReq{}
	if err := util.Json2Struct(c.Get("body").(string), req); err != nil {
		return util.BadParam(c, err)
	}
	if err := _const.Validate.Struct(req); err != nil {
		global.Log.Debugf("上报下载量 BadParam:%v", err)
		return util.BadParam(c, err)
	}
	global.Log.Debugf("上报下载量:%v", req)
	if err := base.Service.InsertDownloadTimes(req); err != nil {
		global.Log.Errorf("上报下载量失败 err:%v", err)
		return util.BuildFail(c, 1, "更新下载次数失败", err)
	}
	return util.BuildSuccess(c, "", "")
}

// @Summary app下載統計前驗證
// @Description 帶入uuid，返回hash
// @Accept  json
// @Produce  json
// @Tags Notice
// @Success 0 {object} api_models.SetCacheReq "result"
// @Router /statistics/setCache [POST]
func (base *Controller) SetCache(c echo.Context) error {
	req := &api_models.SetCacheReq{}
	if err := util.Json2Struct(c.Get("body").(string), req); err != nil {
		return util.BadParam(c, err)
	}
	if err := _const.Validate.Struct(req); err != nil {
		return util.BadParam(c, err)
	}
	hash, err := base.Service.SetCache(req.Uuid)
	if err != nil {
		return util.BuildFail(c, 1, "设置缓存失败", err)
	}
	return util.BuildSuccess(c, hash, "")
}

// @Summary 巨量归因
// @Description customer_active_time不传
// @Accept  json
// @Produce  json
// @Tags Notice
// @Success 0 {object} api_models.AscribeReportReq "result"
// @Router /api/statistics/AscribeReport [POST]
func (base *Controller) AscribeReport(c echo.Context) error {
	req := &api_models.AscribeReportReq{}
	if err := util.Json2Struct(c.Get("body").(string), req); err != nil {
		global.Log.Debugf("巨量归因 - 请求参数解析失败: %v", err)
		return util.BadParam(c, err)
	}

	global.Log.Debugf("巨量归因 - 请求参数: %+v", req)

	if err := _const.Validate.Struct(req); err != nil {
		global.Log.Debugf("巨量归因 - 参数校验失败: %v", err)
		return util.BadParam(c, err)
	}

	err := base.Service.SendAscribeReport(req)

	if err != nil {
		global.Log.Errorf("巨量归因 - 失败: %v", err)
		return util.BuildFail(c, 1, "巨量归因", err)
	}

	global.Log.Debugf("巨量归因 - 成功响应: %+v", req)

	return util.BuildSuccess(c, "", "")
}

// @Summary 事件转化
// @Description customer_active_time不传
// @Accept  json
// @Produce  json
// @Tags Notice
// @Success 0 {object} api_models.AscribeTransformReq "result"
// @Router /api/statistics/AscribeTransform [POST]
func (base *Controller) AscribeTransform(c echo.Context) error {
	req := &api_models.AscribeTransformReq{}
	if err := util.Json2Struct(c.Get("body").(string), req); err != nil {
		global.Log.Debugf("事件转化 - 请求参数解析失败: %v", err)
		return util.BadParam(c, err)
	}

	global.Log.Debugf("事件转化 - 请求参数: %+v", req)

	if err := _const.Validate.Struct(req); err != nil {
		global.Log.Debugf("事件转化 - 参数校验失败: %v", err)
		return util.BadParam(c, err)
	}

	err := base.Service.SetAscribeTransform(req)

	if err != nil {
		global.Log.Errorf("事件转化 - 失败: %v", err)
		return util.BuildFail(c, 1, "事件转化", err)
	}

	global.Log.Debugf("事件转化 - 成功响应: %+v", req)

	return util.BuildSuccess(c, "", "")
}

// @Summary 触点回调
// @Description 巨量后台配置的触点回调
// @Accept  json
// @Produce  json
// @Tags Notice
// @Success 0 {object} api_models.AscribeTransformReq "result"
// @Router /api/statistics/AscribeContact [GET]
func (base *Controller) AscribeContact(c echo.Context) error {
	params := c.QueryParams()
	// 2. 构建 map
	data := make(map[string]interface{})
	for key, values := range params {
		// 如果有多个同名参数，只取第一个
		if len(values) > 0 {
			data[key] = values[0]
		}
	}
	if err := base.Service.SendAscribeContact(data); err != nil {
		global.Log.Errorf("err:%v", err)
		return util.BuildFail(c, 1, "", err)
	}
	return util.BuildSuccess(c, "", "")
}

// @Summary 用户留存天数
// @Description 下载后用户留存天数
// @Accept  json
// @Produce  json
// @Tags Notice
// @Success 0 {object} api_models.DownloadTimesReq "result"
// @Router /statistics/RetentionDays [POST]
func (base *Controller) RetentionDays(c echo.Context) error {
	req := &api_models.RetentionDaysReq{}
	if err := util.Json2Struct(c.Get("body").(string), req); err != nil {
		return util.BadParam(c, err)
	}
	days := base.Service.CalRetentionDays(req.DeviceId)
	return util.BuildSuccess(c, struct {
		Days int64 `json:"days"`
	}{
		Days: days,
	}, "")
}
